#ifndef __MOBSBUF_H__
#define __MOBSBUF_H__

#ifdef __cpluplus
#if __cplusplus
extern "C" {
#endif
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include <errno.h>
#include <pthread.h>

    typedef enum mobs_error_code_e
    {
	MOBS_ERR_OK = 0,
	MOBS_ERR_FAIL = -1,
	MOBS_ERR_PARAM = -2,
	MOBS_ERR_EMPTY = -3,// no object available
	MOBS_ERR_INTERRUPTED = -4, // reading object is covered by some producer
	MOBS_ERR_FLAGS = -5,
	MOBS_ERR_USERFULL = -6,
	MOBS_ERR_FULL = -7,
    }MobsErrorCode;

#define MOBS_FLAG_RDONLY (1<<0)
#define MOBS_FLAG_WRONLY (1<<1)
#define MOBS_FLAG_CREATE (1<<2)
// flag for class-object using mode
#define MOBS_FLAG_SHARED (1<<3) // buffer global flag: Publisher-Subscriber mode
#define MOBS_FLAG_PRIVATE (1<<4) // buffer global flag: Producer-Consumer mode
#define MOBS_FLAG_CONTINUE (1<<5) // Continue user's last objIdx consuming/producing when same user exists!
#define MOBS_FLAG_THREADS (1<<6)
#define MOBS_FLAG_PROCESS (1<<7)
// flag only take effect for consumer/subscriber
#define MOBS_FLAG_LATEST (1<<8)
#define MOBS_FLAG_OLDEST (1<<9)

    /*
     * 创建或者打开指定命名的缓存空间为指定的用户名称
     *
     * @param[in] user_name 指定的用户名称,需要确保唯一,最长32B
     * @param[in] buf_name  缓存命名文件的全路径名称,需要以根目录开头,不同缓存空间必须不同
     * @param[in] flags	    MOBS_FLAG_*缓存空间控制标识
     * @param[in] size	    缓存空间大小
     * @param[in] max_object_num 缓存空间中最大可存放的对象数目,default 4096 if set to 0
     * @param[in] data_page_size 缓存空间中数据页面的大小,default 4096 if set to 0,可选: 1KB,2KB,4KB,8KB
     * @retval 0 - 打开失败, 成功返回用户操作指针,在后续的API中使用
     *
     */
    uintptr_t mobs_open(const char *user_name,const char *buf_name,int flags,size_t size,
	    size_t max_object_num,size_t data_page_size); // return uid
    /*
     * 关闭打开的缓存操作用户
     *
     * @param[in] uid  open返回的用户指针
     */
    int mobs_close(uintptr_t uid);
    int mobs_reset(uintptr_t uid);

    /*
     * 同步缓存空间中的修改数据到命名文件中,可以实现持久化存储功能
     *
     * @param[in] uid  open返回的用户指针
     */
    int mobs_flush(uintptr_t uid);

    /*
     * 删除指定名称的缓存命名文件,解决使用者重新启动的数据一致性问题
     *
     * @param[in] uid  open返回的用户指针
     */
    int mobs_unlink(const char *buf_name);

#define MOBS_OBJFLAG_EOF (1<<0)
    /*
     * 申请一个对象进行读写操作,返回对象ID
     *
     * @param[in] uid  open返回的用户指针
     * @param[in] flags 指定特定的读写标识
     * @retval MobsErrorCode - 失败, oid - 成功
     */
    int mobs_start(uintptr_t uid,int flags); // return oid

    /*
     * 写入数据到请求的对象单元中
     *
     * @param[in] uid  open返回的用户指针
     * @param[in] oid  mobs_start返回的对象ID
     * @param[in] data 数据指针
     * @param[in] count 数据大小
     * @retval 返回写入的数据字节数
     */
    int mobs_write(uintptr_t uid,int oid,void *data,size_t count);

    /*
     * 读取数据从请求的对象单元中
     *
     * @param[in] uid  open返回的用户指针
     * @param[in] oid  mobs_start返回的对象ID
     * @param[in,out] data 存放数据的空间指针
     * @param[in] count  希望读取的数据大小
     * @retval 返回读取的数据字节数
     */
    int mobs_read (uintptr_t uid,int oid,void *data,size_t count);

    /*
     * 提交或放弃对指定对象单元的读写操作
     *
     * @param[in] uid  open返回的用户指针
     * @param[in] oid  mobs_start返回的对象ID
     * @retval -1 - 失败, 0 - 成功 
     */
    int mobs_finish(uintptr_t uid,int oid);
    int mobs_cancel(uintptr_t uid,int oid);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif

#endif

